import axios from "axios";
import { ElMessage, ElMessageBox } from "element-plus";
import router from "@/router";

// 创建axios实例
const service = axios.create({
  baseURL: "http://3790wz6pj968.vicp.fun", // API的base_url
  timeout: 15000, // 请求超时时间
  headers: {
    "Content-Type": "application/json;charset=utf-8",
  },
});

// 请求拦截器
service.interceptors.request.use(
  (config) => {
    // 在发送请求之前做些什么
    const token = localStorage.getItem("token");
    if (token) {
      config.headers["Authorization"] = `Bearer ${token}`;
    }
    return config;
  },
  (error) => {
    // 对请求错误做些什么
    console.error("Request error: ", error);
    return Promise.reject(error);
  }
);

// 响应拦截器
service.interceptors.response.use(
  (response) => {
    const res = response.data;

    // 如果返回的状态码不是200，说明接口请求有误
    // 这里可以根据后端接口规范自定义错误处理
    if (res.code !== 200) {
      ElMessage({
        message: res.message || "Error",
        type: "error",
        duration: 5 * 1000,
      });

      // 50008: 非法的token; 50012: 其他客户端登录了; 50014: Token 过期了;
      if (res.code === 50008 || res.code === 50012 || res.code === 50014) {
        ElMessageBox.confirm(
          "您已被登出，可以取消继续留在该页面，或者重新登录",
          "确定登出",
          {
            confirmButtonText: "重新登录",
            cancelButtonText: "取消",
            type: "warning",
          }
        ).then(() => {
          localStorage.removeItem("token");
          location.reload();
        });
      }

      return Promise.reject(new Error(res.message || "Error"));
    } else {
      return res;
    }
  },
  (error) => {
    console.error("Response error: ", error);

    // 处理HTTP状态码错误
    let message = "连接服务器失败";
    if (error.response) {
      switch (error.response.status) {
        case 401:
          message = "未授权，请重新登录";
          // 重定向到登录页
          localStorage.removeItem("token");
          router.push("/login");
          break;
        case 403:
          message = "拒绝访问";
          break;
        case 404:
          message = "请求地址出错";
          break;
        case 500:
          message = "服务器内部错误";
          break;
        default:
          message = `${error.response.status}: ${error.response.statusText}`;
      }
    }

    ElMessage({
      message: error.message || message,
      type: "error",
      duration: 5 * 1000,
    });

    return Promise.reject(error);
  }
);

export default service;
